import { _decorator, Component, director, Node } from 'cc';
import { GameApp } from '../../Game/Scripts/GameApp';
import { SceneMgr } from '../../Framework/Scripts/Managers/SceneMgr';
import { ResMgr } from '../../Framework/Scripts/Managers/ResMgr';
import { Debug } from '../../Framework/Scripts/Managers/Debug';
import { EventMgr } from '../../Framework/Scripts/Managers/EventMgr';
import { TimerMgr } from '../../Framework/Scripts/Managers/TimerMgr';
import { SoundMgr } from '../../Framework/Scripts/Managers/SoundMgr';
import { ExcelMgr } from '../../Framework/Scripts/Managers/ExcelMgr';
import { NodePoolMgr } from '../../Framework/Scripts/Managers/NodePoolMgr';
import { UIMgr } from '../../Framework/Scripts/Managers/UIMgr';
import { LoadPkg } from "../../Game/Scripts/userData/LoadPkg"
import { UserData } from '../../Game/Scripts/userData/UserData';

/** 
  周无邪出品
  本源码用于学习研究使用。
  作者联系方式：tuya7078（微信）。
 */

const { ccclass, property } = _decorator;


@ccclass('Boot')
export class Boot extends Component {

    public static Instance: Boot = null!;

    @property
    public isDebug: boolean = false;

    @property
    public useWebSocket: boolean = false;

    protected onLoad(): void {
        if (Boot.Instance === null) {
            Boot.Instance = this;
        }
        else {
            this.destroy();
            return;
        }

        director.addPersistRootNode(this.node); // 不随场景切换而删除的节点
        this.StartUp();
    }

    private async StartUp() {
        await this.CheckHotUpdate();
        await this.InitFramework();
    }

    private CheckHotUpdate() {

    }


    private async InitFramework() {
        // 资源管理模块的初始化
        this.node.addComponent(ResMgr).Init();
        // end

        // 自定义事件订阅与发布模块
        this.node.addComponent(EventMgr).Init();
        // end


        // 初始化UI框架
        this.node.addComponent(UIMgr).Init();
        // end

        // Timer模块的初始化
        this.node.addComponent(TimerMgr).Init();
        //end

        // 初始化声音播放模块
        this.node.addComponent(SoundMgr).Init();
        // end

        // 初始化我们的Excel表格模块
        this.node.addComponent(ExcelMgr).Init();
        // end

        // 初始化节点池
        this.node.addComponent(NodePoolMgr).Init();
        // end

 
        // 场景管理模块
        this.node.addComponent(SceneMgr).Init();

        this.node.addComponent(LoadPkg)
        // end

        // 初始化我们的日志管理模块
        if (this.isDebug) {
            await this.node.addComponent(Debug).Init();
        }
        // end
        this.node.addComponent(UserData).Init()


        // 进入游戏
        this.node.addComponent(GameApp).Init();


        //首次加载
        ResMgr.Instance.preloadResPkg(LoadPkg.Instance.pkg.bootData, () => { }, () => {
            GameApp.Instance.enterGame();
        })

        // end
    }
}


